package core

import (
	"errors"
)

// List 基于切片实现的列表结构
type List[T any] struct {
	elements []T
}

// NewList 创建一个新的列表
func NewList[T any]() *List[T] {
	return &List[T]{
		elements: make([]T, 0),
	}
}

// Len 返回列表长度
func (l *List[T]) Len() int {
	return len(l.elements)
}

// Get 获取指定索引的元素
func (l *List[T]) Get(index int) (T, error) {
	var zero T
	if index < 0 || index >= len(l.elements) {
		return zero, errors.New("索引超出范围")
	}
	return l.elements[index], nil
}

// Append 在列表末尾添加元素
func (l *List[T]) Append(element T) {
	l.elements = append(l.elements, element)
}

// Insert 在指定索引位置插入元素
func (l *List[T]) Insert(index int, element T) error {
	if index < 0 || index > len(l.elements) {
		return errors.New("索引超出范围")
	}

	// 创建新切片并插入元素
	l.elements = append(l.elements[:index], append([]T{element}, l.elements[index:]...)...)
	return nil
}

// Remove 删除指定索引的元素
func (l *List[T]) Remove(index int) (T, error) {
	var zero T
	if index < 0 || index >= len(l.elements) {
		return zero, errors.New("索引超出范围")
	}

	// 保存要删除的元素
	element := l.elements[index]

	// 通过切片拼接删除元素
	l.elements = append(l.elements[:index], l.elements[index+1:]...)
	return element, nil
}

// Contains 检查列表是否包含指定元素（需要提供相等性比较函数）
func (l *List[T]) Contains(element T, equals func(a, b T) bool) bool {
	for _, e := range l.elements {
		if equals(e, element) {
			return true
		}
	}
	return false
}

// IndexOf 查找元素在列表中的索引（需要提供相等性比较函数）
func (l *List[T]) IndexOf(element T, equals func(a, b T) bool) int {
	for i, e := range l.elements {
		if equals(e, element) {
			return i
		}
	}
	return -1
}

// Clear 清空列表
func (l *List[T]) Clear() {
	l.elements = make([]T, 0)
}

// ToSlice 将列表转换为切片
func (l *List[T]) ToSlice() []T {
	return l.elements
}

// func main() {
// 	// 创建一个整数列表
// 	intList := NewList[int]()

// 	// 追加元素
// 	intList.Append(10)
// 	intList.Append(20)
// 	intList.Append(30)
// 	fmt.Println("初始列表:", intList.ToSlice())

// 	// 插入元素
// 	err := intList.Insert(1, 15)
// 	if err == nil {
// 		fmt.Println("插入元素后:", intList.ToSlice())
// 	}

// 	// 获取元素
// 	val, _ := intList.Get(2)
// 	fmt.Println("索引2的元素:", val)

// 	// 检查包含性
// 	has20 := intList.Contains(20, func(a, b int) bool { return a == b })
// 	fmt.Println("是否包含20:", has20)

// 	// 查找索引
// 	idx := intList.IndexOf(15, func(a, b int) bool { return a == b })
// 	fmt.Println("15的索引:", idx)

// 	// 删除元素
// 	removed, _ := intList.Remove(2)
// 	fmt.Println("删除的元素:", removed)
// 	fmt.Println("删除后列表:", intList.ToSlice())

// 	// 清空列表
// 	intList.Clear()
// 	fmt.Println("清空后列表长度:", intList.Len())

// 	// 字符串列表示例
// 	strList := NewList[string]()
// 	strList.Append("apple")
// 	strList.Append("banana")
// 	fmt.Println("字符串列表:", strList.ToSlice())
// }
